iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0

在時序資料前處理中,smoothing為最常見的一個資料前處理的步驟,其目的在於移除資料中的干擾(noise),期望找到長期(long-term)的特徵並減少短期(short-term)訊號影響。常使用的方法為移動平均(moving average),為利用統計方法將依定時間內的數值加以平均,並將不同時間所獲得的平均值連接在一起。

移動平均算法

  1. 簡單移動平均(Simple moving average, SMA)
    https://ithelp.ithome.com.tw/upload/images/20220913/20151279wcMYDzoRQZ.png
    其中n為窗口大小,SMA_t(n)為時間點t的移動平均值

  2. 加權移動平均(Weighted moving average, WMA)
    與簡單移動平均相似,但在計算平均數值並不是每個時間點都給予相同權重,而是以最近的觀察值更大的權重。
    https://ithelp.ithome.com.tw/upload/images/20220913/20151279VgKAXKirPc.png

  3. 指數平滑移動平均(Exponential moving average, EMA)
    為加權移動平均的其中一種,會以一固定指數遞減數列作為各個時間點的權重。
    https://ithelp.ithome.com.tw/upload/images/20220913/20151279X2jlvMgzVP.png

一般在進行穿戴式裝置資料處理時,較常使用的為簡單移動平均,而除了使用smoothing來減小雜訊的干擾之外,另一種處理方法為取特定時間區段之平均值,如:每五秒取一個資料點(即將五秒內的所有資料點取平均),此方法可以有效減低雜訊的影響並大幅減少資料量。

實作

R: 參考

library(TTR)

# 選取其中一段活動訊號(200個資料點),建立dataframe
smooth_df <- data.frame(Time = seq(1,length(dataset2[6657:6857,1]),1), alx = dataset2[6657:6857,1])
# 以每5個資料點進行smoothing,可透過function內的n來做設定
# Simple moving average
smooth_df$sma5_x <- TTR::SMA(dataset2[6657:6857,c(1)], n = 5)   
# Weighted moving average
smooth_df$wma5_x <- TTR::WMA(dataset2[6657:6857,c(1)], n = 5)   
# Exponential moving average
smooth_df$ema5_x <- TTR::EMA(dataset2[6657:6857,c(1)], n = 5)   

# 使用ggplot繪圖
ggplot(smooth_df,aes(x = Time))+
  geom_line(aes(y = alx, colour = "Original"))+
  geom_line(aes(y = sma5_x, colour = "SMA"))+
  geom_line(aes(y = wma5_x, colour = "WMA"))+
  geom_line(aes(y = ema5_x, colour = "EMA"))+
  scale_colour_manual("", breaks = c("Original", "SMA", "WMA",'EMA'),values = c('grey',"red", "green", "blue"))

https://ithelp.ithome.com.tw/upload/images/20220914/20151279lIQzFNuE7V.png

Python: 參考

# 選取其中一段活動訊號(200個資料點),建立dataframe
smoothing_data = dataset2.iloc[list(range(6656,6856,1)),[0]]
smoothing_data['Time'] = range(1,201,1)

# 以每5個資料點進行smoothing,可透過function內的n來做設定
# SMA
smoothing_data['SMA'] = smoothing_data['alx'].rolling(window=5).mean()
# WMA
weights = np.array([0.1, 0.2, 0.3, 0.4, 0.5])
sum_weights = np.sum(weights)
smoothing_data['WMA'] = (smoothing_data['alx'].rolling(window=5)
    .apply(lambda x: np.sum(weights*x) / sum_weights, raw=False))
# EMA
smoothing_data['EMA'] = smoothing_data['alx'].ewm(span = 5).mean()
# plot
plt.rcParams['figure.figsize'] = 10, 6   #設定圖片大小
smoothing_data.plot(x="Time", y=["alx", "SMA",'WMA','EMA'],kind = 'line')
plt.legend(labels = ['Original','SMA','WMA','EMA'],bbox_to_anchor=(1.0, 1.0))

https://ithelp.ithome.com.tw/upload/images/20220914/20151279VUgVyd75B1.png


上一篇
[Day6]遺失資料(Missing data)處理
下一篇
[Day8]資料正規化(Normalization)與標準化(Standardization)
系列文
人類行為數據分析- 以R和Python進行實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言